package com.tansun.easycare.rule.ml.algorithm.service;

import java.io.File;
import java.util.List;
import java.util.Map;

import com.tansun.easycare.rule.ml.algorithm.entity.AlogrithmVariables;
import com.tansun.easycare.rule.ml.algorithm.entity.ApplyData;
import com.tansun.easycare.rule.ml.algorithm.entity.DataVariableList;
import com.tansun.easycare.rule.ml.algorithm.entity.DatabaseConn;
import com.tansun.easycare.rule.ml.algorithm.entity.FormulaDict;
import com.tansun.easycare.rule.ml.algorithm.entity.ImgVariables;
import com.tansun.easycare.rule.ml.algorithm.entity.MuntiTables;
import com.tansun.easycare.rule.ml.algorithm.entity.PyRequest;
import com.tansun.easycare.rule.ml.algorithm.entity.PyResponse;
import com.tansun.easycare.rule.ml.algorithm.entity.StockVariables;
import com.tansun.easycare.rule.ml.algorithm.entity.TicketVariables;
import com.tansun.easycare.rule.ml.model.entity.MlDataModel;

/**
 * 机器学习算法服务Service，包括数据导入，变量设置，数据处理，可视化，流程记录，模型训练，测试评估等
 * @author xch
 * @version 2018-08-23
 */
public interface IAlgorthmService {
	
	/**
	 * 导入模型
	 * @param model
	 * @return
	 */
	public PyResponse loadModel(MlDataModel mlDataModel);
	
	/**
	 * 模型创建，在python服务中初始化
	 * @param model
	 * @return
	 */
	public PyResponse createModel(MlDataModel mlDataModel);
	
	/**
	 * 删除模型
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse delModel(MlDataModel mlDataModel);
	
	/**
	 * 删除模型
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse delModel(List<MlDataModel> mlDataModelList);
	
	
	/**
	 * 删除模型训练部分
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse modelTrainDel(MlDataModel mlDataModel);
	
	/**
	 * 保存模型
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse saveModel(MlDataModel mlDataModel);
	
	/**
	 * 模型转换成可以发布的形式
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse transSaveType(MlDataModel mlDataModel);
	/**
	 * 
	 * 更新模型
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse updateModel(MlDataModel mlDataModel);
	
	/**
	 * 数据导入
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse dataLoad(MlDataModel mlDataModel);
	
	/**
	 * 数据修改
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse dataModify(MlDataModel mlDataModel,DataVariableList dataVriables);
	
	/**
	 * 删除缺失值
	 * @param mlDataModel,dataVriables
	 * @return
	 */
	public PyResponse deleteMissingValue(MlDataModel mlDataModel,DataVariableList dataVriables);
	
	/**
	 * 删除缺失值
	 * @param mlDataModel,dataVriables
	 * @return
	 */
	public PyResponse deleteAllNa(MlDataModel mlDataModel,DataVariableList dataVriables);
	
	/**
	 * 替换缺失值
	 * @param mlDataModel,dataVriables
	 * @return
	 */
	public PyResponse replaceMissingValue(MlDataModel mlDataModel,DataVariableList dataVriables);
	
	/**
	 * 替换缺失值
	 * @param mlDataModel,dataVriables
	 * @return
	 */
	public PyResponse replaceAllNa(MlDataModel mlDataModel,DataVariableList dataVriables);
	/**
	 * 替换缺失值
	 * @param mlDataModel,dataVriables
	 * @return
	 */
	public PyResponse deleteTable(MlDataModel mlDataModel,String tableName);
	
	
	/**
	 * 数据集变量设置
	 * @param mlDataModel
	 * @param dataVriables
	 * @return
	 */
	public PyResponse dataVariablesSetup(MlDataModel mlDataModel,DataVariableList dataVriables);
	
	/**
	 * 获取变量设置
	 * @param mlDataModel
	 * @param dataVriables
	 * @return
	 */
	public PyResponse getParameter(MlDataModel mlDataModel);
	
	
	/**
	 * 数据集目标变量标签化
	 * @param mlDataModel
	 * @param dataVriables
	 * @return
	 */
	public PyResponse dataTargetVarsLabelSetup(MlDataModel mlDataModel,DataVariableList dataVriables);
	
	
	/**
	 * 数据集平衡设置
	 * @param mlDataModel
	 * @param dataVriables
	 * @return
	 */
	public PyResponse dataBanlanceSetup(MlDataModel mlDataModel,DataVariableList dataVriables);
	
	/**
	 * 数据集分割设置，分为训练集和测试集
	 * @param mlDataModel
	 * @param dataVriables
	 * @return
	 */
	public PyResponse dataSplitSetup(MlDataModel mlDataModel,DataVariableList dataVriables);
	
	/**
	 * 获取图片数据
	 * @param mlDataModel
	 * @param imgVariables
	 * @return
	 */
	public PyResponse getImgData(MlDataModel mlDataModel,ImgVariables imgVariables);
	
	/**
	 * 获取图片数据
	 * @param mlDataModel
	 * @param imgVariables
	 * @return
	 */
	public PyResponse addColumn(MlDataModel mlDataModel, FormulaDict formulaDict);
	
	/**
	 * 获取图片数据，分析目标列
	 * @param mlDataModel
	 * @param imgVariables
	 * @return
	 */
	public PyResponse getTargetVarAnalysis(MlDataModel mlDataModel,ImgVariables imgVariables);
	
	/**
	 * 保存特征工程结果
	 * @param mlDataModel
	 * @param imgVariables
	 * @return
	 */
	public PyResponse saveFeatureData(MlDataModel mlDataModel);
	
	/**
	 * 设置特征工程输入输出值
	 * @param mlDataModel
	 * @param muntiTables
	 * @return
	 */
	public PyResponse setInOutVariable(MlDataModel mlDataModel, MuntiTables muntiTables);
	
	/**
	 * 数据平衡
	 * @param mlDataModel
	 * @param muntiTables
	 * @return
	 */
	public PyResponse dataBanlance(MlDataModel mlDataModel, MuntiTables muntiTables);
	  
	
	/**
	 * 获取特征工程先关图数据
	 * @param mlDataModel
	 * @param muntiTables
	 * @return
	 */
	public PyResponse getCorrelogramData(MlDataModel mlDataModel, MuntiTables muntiTables);
	/**
	 * 列数据替换
	 * @param mlDataModel
	 * @param imgVariables
	 * @return
	 */
	public PyResponse replaceColumnsValue(MlDataModel mlDataModel,ImgVariables imgVariables);
	
	/**
	 * 设置目标变量
	 * @param mlDataModel
	 * @param imgVariables
	 * @return
	 */
	public PyResponse setTarget(MlDataModel mlDataModel,ImgVariables imgVariables);
	/**
	 * 获取支持度置信度图片数据
	 * @param mlDataModel
	 * @param imgVariables
	 * @return
	 */
	public PyResponse getSCcurve(MlDataModel mlDataModel,ImgVariables imgVariables);
	
	/**
	 * 设置变量操作是否保留
	 * @param mlDataModel
	 * @param imgVariables
	 * @return
	 */
	public PyResponse setVaribleOperate(MlDataModel mlDataModel,ImgVariables imgVariables);
	
	/**
	 * 聚类类别重命名
	 * @param mlDataModel
	 * @param ApplyData
	 * @return
	 */
	public PyResponse className(MlDataModel mlDataModel,ApplyData applyData);
	
	/**
	 * 获取类别数据
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getClass(MlDataModel mlDataModel);
	
	
	/**
	 * 获取最佳K值数据
	 * @param mlDataModel
	 * @param imgVariables
	 * @return
	 */
	public PyResponse getBestKData(MlDataModel mlDataModel,ImgVariables imgVariables);
	
	/**
	 * 上传数据
	 * @param localFile 文件路径
	 * @param modelId 模型id,唯一标识
	 * @param apply 功能 训练或者应用测试
	 * @return
	 */
	public PyResponse upload(String datapath,String modelId, String apply) ;
	
	/**
	 * 上传数据
	 * @param inputStream 文件流
	 * @param modelId 模型id,唯一标识
	 * @param apply 功能 训练或者应用测试
	 * @return
	 */
	public PyResponse upload(File file,Map<String,String> inputMap);
	
	/**
	 * 上传数据
	 * @param inputStream 文件流
	 * @param modelId 模型id,唯一标识
	 * @param apply 功能 训练或者应用测试
	 * @return
	 */
	public PyResponse upload(byte[] byteArr,String filename,Map<String,String> inputMap);
	
	/**
	 * 通过数据库导入数据
	 * @return
	 */
	public PyResponse loadDataByDBTabel(MlDataModel mlDataModel,DatabaseConn databaseConn);

	/**
	 * 导入股票数据
	 * @param mlDataModel
	 * @param dataVriables
	 * @return
	 */
	public PyResponse loadStockData(MlDataModel mlDataModel,StockVariables stockVariables);
	
	/**
	 * 导入彩票数据
	 * @param mlDataModel
	 * @param dataVriables
	 * @return
	 */
	public PyResponse loadTicketData(MlDataModel mlDataModel,TicketVariables ticketVariables);
	
	
	/**
	 * 获取统计数据
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getDataStatistics(MlDataModel mlDataModel);
	
	/**
	 * 获取算法流程
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getWorkflows(MlDataModel mlDataModel,String currentSite);

	
	/**
	 * 更新算法流程
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse updateWorkflows(MlDataModel mlDataModel,String currentSite);
	/**
	 * 算法参数设置
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse parameterSetup(MlDataModel mlDataModel, AlogrithmVariables alogrithmVariables);
	/**
	 * 数据设置
	 * @param mlDataModel,alogrithmVariables
	 * @return
	 */
	public PyResponse dataSetup(MlDataModel mlDataModel, AlogrithmVariables alogrithmVariables);
	 
	/**
	 * 数据处理
	 * @param mlDataModel,alogrithmVariables
	 * @return
	 */
	public PyResponse dataProcess(MlDataModel mlDataModel);
	 
	/**
	 * 可视化设置
	 * @param mlDataModel,alogrithmVariables
	 * @return
	 */
	public PyResponse visualPreview(MlDataModel mlDataModel);
	 
	/**
	 * 进行模型训练
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse trainModel(MlDataModel mlDataModel);
	
	/**
	 * 获取训练结果
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getTrainData(MlDataModel mlDataModel);
	
	/**
	 * 
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getTransferData(MlDataModel mlDataModel);
	/**
	 * 测试模型
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse testAnalysis(MlDataModel mlDataModel);
	
	/**
	 * 应用模型
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse modelApply(MlDataModel mlDataModel,ApplyData applyData,ImgVariables imgVariables);
	
	/**
	 * 载数据处理
	 * @param savepath
	 * @return
	 */
	public PyResponse dataSetProcess(MlDataModel mlDataModel,String dataSetFile);
		
	/**
	 * 下载文件，图片等
	 * @param savepath
	 * @return
	 */
	public byte[] downloadFile(String savepath);
	
	/**
	 * 获取变量信息
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getVariableMsg(MlDataModel mlDataModel);
	
	/**
	 * 设置数据用途
	 * @param mlDataModel alogrithmVariables
	 * @return
	 */
	public PyResponse setUsedType(MlDataModel mlDataModel,AlogrithmVariables alogrithmVariables);
	
	/**
	 * 获取混淆矩阵
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getConfusionMatrix(MlDataModel mlDataModel,ImgVariables imgVariables);
	
	/**
	 * 获取roc曲线矩阵
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getRocCurve(MlDataModel mlDataModel,ImgVariables imgVariables);
	
	/**
	 * 获取lift曲线
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getLiftCurve(MlDataModel mlDataModel,ImgVariables imgVariables);
	
	/**
	 * 获取对比数据
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getCompareTestData(MlDataModel mlDataModel,ImgVariables imgVariables);
	
	/**
	 * 获取输入参数信息
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getInputArgsMsg(MlDataModel mlDataModel);
	
	/**
	 * 获取数据设置参数信息
	 * @param mlDataModel
	 * @return
	 */
	public PyResponse getDataSetInputMsg(MlDataModel mlDataModel);
	
	/**
	 * 获取特征工程项目
	 * @return
	 */
	public PyResponse getFeatureProject();
	
	
	/**
	 * 发送请求
	 * @param operate
	 * @return
	 */
	public PyResponse doPostRequest(PyRequest req);
}
